package com.zy.explore.sys.domain.mybatis.entity;

import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.zy.explore.common.infrastructure.base.mybatis.MpBaseEntity;
import com.zy.explore.common.infrastructure.util.StrUtil;
import com.zy.explore.sys.interfaces.frm.UserQueryFrm;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;

/**
 * 表(sys_user)对应的Mybatis ORM实体对象
 *
 * @author 🇨🇳中国印🇨🇳
 * @date 2022年01月30日 00:38:18
 */
@Slf4j
@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
@TableName("sys_user")
@Table(name = "sys_user")
public class User extends MpBaseEntity<User, Long> {

    /**
     * 主键
     */
    @Id
    @Column(name = "id")
    @TableId(type = IdType.ID_WORKER)
    private Long id;

    /**
     * 账号
     */
    @Column(name = "account")
    private String account;

    /**
     * 密码
     */
    @Column(name = "pwd_hash_value")
    private String pwdHashValue;

    /**
     * 昵称
     */
    @Column(name = "nick_name")
    private String nickName;

    /**
     * 姓名
     */
    @Column(name = "name")
    private String name;

    /**
     * 头像
     */
    @Column(name = "avatar")
    private Long avatar;

    /**
     * 生日
     */
    @Column(name = "birthday")
    private Date birthday;

    /**
     * 性别(字典 1男 2女 3未知)
     */
    @Column(name = "sex")
    private Integer sex;

    /**
     * 邮箱
     */
    @Column(name = "email")
    private String email;

    /**
     * 手机
     */
    @Column(name = "phone")
    private String phone;

    /**
     * 电话
     */
    @Column(name = "tel")
    private String tel;

    /**
     * 最后登陆IP
     */
    @Column(name = "last_login_ip")
    private String lastLoginIp;

    /**
     * 最后登陆时间
     */
    @Column(name = "last_login_time")
    private Date lastLoginTime;

    /**
     * 管理员类型（0超级管理员 1非管理员）
     */
    @Column(name = "admin_type")
    private Integer adminType;

    /**
     * 状态（字典 0正常 1冻结 2删除）
     */
    @Column(name = "status")
    private Integer status;

    /**
     * 创建时间
     */
    @Column(name = "create_time")
    private Date createTime;

    /**
     * 创建人
     */
    @Column(name = "create_user")
    private Long createUser;

    /**
     * 更新时间
     */
    @Column(name = "update_time")
    private Date updateTime;

    /**
     * 更新人
     */
    @Column(name = "update_user")
    private Long updateUser;


    /**
     * 组装查询条件
     *
     * @param frm 请求参数
     * @return {@link Wrapper<User> }
     */
    public static Wrapper<User> getWrapper(UserQueryFrm frm) {
        // TODO 请按实际需求组装查询条件
        log.warn("TODO 请按实际需求组装查询条件");
        if (frm.getPageNum() == null || frm.getPageNum() <= 0) {
            frm.setPageNum(1);
        }
        if (frm.getPageSize() == null || frm.getPageSize() <= 0) {
            frm.setPageSize(10);
        }
        Wrapper<User> wrapper = new EntityWrapper<>();
        if(frm.getId() != null) {
            wrapper.eq(StrUtil.humpToUnderline("id"), frm.getId());
        }
        if (!StringUtils.isEmpty(frm.getAccount())) {
            wrapper.like(StrUtil.humpToUnderline("account"), frm.getAccount() + "%");
        }
        if (!StringUtils.isEmpty(frm.getPwdHashValue())) {
            wrapper.like(StrUtil.humpToUnderline("pwdHashValue"), frm.getPwdHashValue() + "%");
        }
        if (!StringUtils.isEmpty(frm.getNickName())) {
            wrapper.like(StrUtil.humpToUnderline("nickName"), frm.getNickName() + "%");
        }
        if (!StringUtils.isEmpty(frm.getName())) {
            wrapper.like(StrUtil.humpToUnderline("name"), frm.getName() + "%");
        }
        if(frm.getAvatar() != null) {
            wrapper.eq(StrUtil.humpToUnderline("avatar"), frm.getAvatar());
        }
        if(!StringUtils.isEmpty(frm.getBirthdayBegin())) {
            wrapper.ge(StrUtil.humpToUnderline("birthday"), frm.getBirthdayBegin());
        }
        if(!StringUtils.isEmpty(frm.getBirthdayEnd())) {
            wrapper.le(StrUtil.humpToUnderline("birthday"), frm.getBirthdayEnd());
        }
        if(frm.getSex() != null) {
            wrapper.eq(StrUtil.humpToUnderline("sex"), frm.getSex());
        }
        if (!StringUtils.isEmpty(frm.getEmail())) {
            wrapper.like(StrUtil.humpToUnderline("email"), frm.getEmail() + "%");
        }
        if (!StringUtils.isEmpty(frm.getPhone())) {
            wrapper.like(StrUtil.humpToUnderline("phone"), frm.getPhone() + "%");
        }
        if (!StringUtils.isEmpty(frm.getTel())) {
            wrapper.like(StrUtil.humpToUnderline("tel"), frm.getTel() + "%");
        }
        if (!StringUtils.isEmpty(frm.getLastLoginIp())) {
            wrapper.like(StrUtil.humpToUnderline("lastLoginIp"), frm.getLastLoginIp() + "%");
        }
        if(!StringUtils.isEmpty(frm.getLastLoginTimeBegin())) {
            wrapper.ge(StrUtil.humpToUnderline("lastLoginTime"), frm.getLastLoginTimeBegin());
        }
        if(!StringUtils.isEmpty(frm.getLastLoginTimeEnd())) {
            wrapper.le(StrUtil.humpToUnderline("lastLoginTime"), frm.getLastLoginTimeEnd());
        }
        if(frm.getAdminType() != null) {
            wrapper.eq(StrUtil.humpToUnderline("adminType"), frm.getAdminType());
        }
        if(frm.getStatus() != null) {
            wrapper.eq(StrUtil.humpToUnderline("status"), frm.getStatus());
        }
        if(!StringUtils.isEmpty(frm.getCreateTimeBegin())) {
            wrapper.ge(StrUtil.humpToUnderline("createTime"), frm.getCreateTimeBegin());
        }
        if(!StringUtils.isEmpty(frm.getCreateTimeEnd())) {
            wrapper.le(StrUtil.humpToUnderline("createTime"), frm.getCreateTimeEnd());
        }
        if(frm.getCreateUser() != null) {
            wrapper.eq(StrUtil.humpToUnderline("createUser"), frm.getCreateUser());
        }
        if(!StringUtils.isEmpty(frm.getUpdateTimeBegin())) {
            wrapper.ge(StrUtil.humpToUnderline("updateTime"), frm.getUpdateTimeBegin());
        }
        if(!StringUtils.isEmpty(frm.getUpdateTimeEnd())) {
            wrapper.le(StrUtil.humpToUnderline("updateTime"), frm.getUpdateTimeEnd());
        }
        if(frm.getUpdateUser() != null) {
            wrapper.eq(StrUtil.humpToUnderline("updateUser"), frm.getUpdateUser());
        }
        return wrapper;
    }
}